package com.ipay.utils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.math.RoundingMode;

/**
 * 数字运算工具类
 * 
 * @author hacken
 *
 */
public class MathUtil {

	/**
	 * 精度
	 */
	final static int precisionOf = 2;

	final static MathContext matchPrecisionOf = new MathContext(precisionOf + 1, RoundingMode.HALF_UP);

	/**
	 * 两数相减
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static double numberMinus(double d1, double d2) {
		return new BigDecimal(Double.toString(d1)).subtract(new BigDecimal(Double.toString(d2))).doubleValue();
	}

	/**
	 * 两数相加
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static double numberAdd(double d1, double d2) {
		return new BigDecimal(Double.toString(d1)).add(new BigDecimal(Double.toString(d2))).doubleValue();
	}

	/**
	 * 两数相除
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static double numberDivide(double d1, double d2) {
		return new BigDecimal(Double.toString(d1))
				.divide(new BigDecimal(Double.toString(d2)), precisionOf, RoundingMode.HALF_UP).doubleValue();
	}

	/**
	 * 两数相乘
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static double numberMultiply(double d1, double d2) {
		return new BigDecimal(Double.toString(d1)).multiply(new BigDecimal(Double.toString(d2)), matchPrecisionOf)
				.doubleValue();
	}

	public static BigDecimal getBigDecimal( Object value ) {
		BigDecimal ret = null;
		if( value != null ) {
			if( value instanceof BigDecimal ) {
				ret = (BigDecimal) value;
			} else if( value instanceof String ) {
				ret = new BigDecimal( (String) value );
			} else if( value instanceof BigInteger) {
				ret = new BigDecimal( (BigInteger) value );
			} else if( value instanceof Number ) {
				ret = new BigDecimal( ((Number)value).doubleValue() );
			} else {
				throw new ClassCastException("Not possible to coerce ["+value+"] from class "+value.getClass()+" into a BigDecimal.");
			}
		}
		return ret;
	}
}
